"""
用户相关API - 模块化版本
API位置: app/api/v1/user.py
访问路径: /api/v1/user/
"""
from flask import request, g
from flask_restx import Resource, fields
from app.models import User, db
from app.utils.response import success_response, error_response
from app.utils.validators import validate_phone, validate_email, validate_password
from app.middleware.auth_middleware import auth_required
from datetime import datetime
from . import user_ns

# 定义数据模型
user_info_model = user_ns.model('UserInfo', {
    'id': fields.Integer(description='用户ID'),
    'username': fields.String(description='用户名'),
    'phone': fields.String(description='手机号'),
    'email': fields.String(description='邮箱'),
    'is_active': fields.Boolean(description='是否激活'),
    'created_at': fields.String(description='创建时间'),
    'last_login': fields.String(description='最后登录时间')
})

@user_ns.route('/info')
class UserInfo(Resource):
    @auth_required
    @user_ns.doc('获取用户信息', params={'phone': '用户手机号'})
    def get(self):
        """获取用户信息，可以通过手机号参数查询指定用户
        
        访问路径: /api/v1/user/info
        参数:
        - phone: 用户手机号(可选，不提供则返回当前登录用户信息)
        
        返回:
        - 成功: {"code": 200, "message": "success", "data": 用户信息对象}
        - 失败: {"code": 错误码, "message": "错误信息", "data": null}
        """
        # 获取手机号参数
        phone = request.args.get('phone')
        
        # 如果提供了手机号参数
        if phone:
            # 验证手机号格式
            if not validate_phone(phone):
                return error_response('手机号格式不正确', 400)
            
            # 根据手机号查询用户
            user = User.query.filter_by(phone=phone).first()
            if not user:
                return error_response('未找到该手机号对应的用户', 404)
            
            # 返回用户信息
            return success_response(user.to_dict())
        
        # 没有提供手机号参数，返回当前登录用户信息
        user = g.current_user
        return success_response(user.to_dict())

@user_ns.route('/profile')
class UserProfile(Resource):
    @auth_required
    @user_ns.doc('更新用户资料')
    def put(self):
        """更新用户资料
        
        访问路径: /api/v1/user/profile
        请求体参数:
        - phone: 用户手机号(可选)
        - email: 用户邮箱(可选)
        
        返回:
        - 成功: {"code": 200, "message": "资料更新成功", "data": 更新后的用户信息对象}
        - 失败: {"code": 错误码, "message": "错误信息", "data": null}
        """
        data = request.get_json()
        user = g.current_user
        
        # 更新允许的字段
        if 'phone' in data:
            if not validate_phone(data['phone']):
                return error_response('手机号格式不正确', 400)
            if User.query.filter(User.phone == data['phone'], User.id != user.id).first():
                return error_response('手机号已存在', 400)
            user.phone = data['phone']
        
        if 'email' in data:
            if data['email'] and not validate_email(data['email']):
                return error_response('邮箱格式不正确', 400)
            if data['email'] and User.query.filter(User.email == data['email'], User.id != user.id).first():
                return error_response('邮箱已存在', 400)
            user.email = data['email']
        
        user.updated_at = datetime.utcnow()
        db.session.commit()
        
        return success_response(user.to_dict(), '资料更新成功')

@user_ns.route('/change-password')
class ChangePassword(Resource):
    @auth_required
    @user_ns.doc('修改密码')
    def post(self):
        """修改密码
        
        访问路径: /api/v1/user/change-password
        请求体参数:
        - old_password: 当前密码(必填)
        - new_password: 新密码(必填)
        
        返回:
        - 成功: {"code": 200, "message": "密码修改成功", "data": null}
        - 失败: {"code": 错误码, "message": "错误信息", "data": null}
        """
        data = request.get_json()
        
        if not data or 'old_password' not in data or 'new_password' not in data:
            return error_response('旧密码和新密码不能为空', 400)
        
        user = g.current_user
        
        # 验证旧密码
        if not user.check_password(data['old_password']):
            return error_response('旧密码错误', 400)
        
        # 验证新密码
        is_valid, msg = validate_password(data['new_password'])
        if not is_valid:
            return error_response(msg, 400)
        
        # 设置新密码
        user.set_password(data['new_password'])
        user.updated_at = datetime.utcnow()
        db.session.commit()
        
        return success_response(None, '密码修改成功')

@user_ns.route('/delete')
class DeleteUser(Resource):
    @auth_required
    @user_ns.doc('删除用户', params={'phone': '用户手机号', 'id': '用户ID'})
    def delete(self):
        """删除用户，支持通过手机号或用户ID进行删除
        
        访问路径: /api/v1/user/delete
        参数:
        - phone: 用户手机号(与id参数二选一)
        - id: 用户ID(与phone参数二选一)
        
        返回:
        - 成功: {"code": 200, "message": "用户删除成功", "data": null}
        - 失败: {"code": 错误码, "message": "错误信息", "data": null}
        """
        # 获取参数
        phone = request.args.get('phone')
        user_id = request.args.get('id')
        
        # 验证参数，至少提供一个参数
        if not phone and not user_id:
            return error_response('必须提供手机号或用户ID', 400)
        
        # 查询用户
        user = None
        
        if phone:
            # 验证手机号格式
            if not validate_phone(phone):
                return error_response('手机号格式不正确', 400)
            
            user = User.query.filter_by(phone=phone).first()
        elif user_id:
            # 验证用户ID格式
            try:
                user_id = int(user_id)
            except ValueError:
                return error_response('用户ID必须是数字', 400)
            
            user = User.query.get(user_id)
        
        # 检查用户是否存在
        if not user:
            return error_response('未找到该用户', 404)
        
        # 删除用户
        db.session.delete(user)
        db.session.commit()
        
        return success_response(None, '用户删除成功')
